// @ts-nocheck

import { extend } from "lodash";

// 删除并且替换部分元素
type Splice<
  T extends any[],
  Start extends number = T["length"],
  End extends number = T["length"],
  I extends any[] = [], //插入的元素
  StartArr extends any[] = [], //记录到达开始的长度
  EndArr extends any[] = [], //记录到达结束的长度
  F extends any[] = [], //最后返回的元素
  D extends any[] = [] //记录删除的长度
> = T extends [infer L, ...infer R]
  ? StartArr["length"] extends Start
    ? D["length"] extends End
      ? [...F, ...I, ...T] //到达开始和结束了
      : Splice<R, Start, End, I, StartArr, [...EndArr, null], F, [...D, null]> //到达开始，没有到达结束
    : Splice<
        R,
        Start,
        End,
        I,
        [...StartArr, null],
        [...EndArr, null],
        [...F, L]
      > //没有到达开始
  : F;

type A1 = Splice<[string, number, boolean, null, undefined, never], 0, 2>; // [boolean,null,undefined,never]               从第0开始删除，删除2个元素
type A2 = Splice<[string, number, boolean, null, undefined, never], 1, 3>; // [string,undefined,never]                     从第1开始删除，删除3个元素
type A3 = Splice<
  [string, number, boolean, null, undefined, never],
  1,
  2,
  [1, 2, 3]
>; // [string,1,2,3,null,undefined,never]          从第1开始删除，删除2个元素，替换为另外三个元素1,2,3                            从第0个位置开始，保留后面所有元素类型

export {};
